﻿//30min棋盘问题
#include <iostream>

using namespace std;
int n, m;
int x, y;
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            int count = (n - i + 1) * (m - j + 1);
            if (i == j) x += count;
            else y += count;
        }
    cout << x << " " << y << endl;
    return 0;
}
//#include <iostream>
//#include <cstring>
//using namespace std;
//const int N = 5010, M = 2e6 + 10;
//int n, m;
//int x[N], w[N];
//int f[M];
//int main()
//{
//	cin >> m >> n;
//	for (int i = 1; i <= n; i++) cin >> w[i] >> x[i];
//	memset(f, 0x3f, sizeof f);
//	f[0] = 0;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = m; j >= 0; j--)
//		{
//			for (int k = 0; k <= x[i]; k++)
//			{
//				f[j] = min(f[j], f[max(0, j - k)] + k * w[i]);
//			}
//		}
//	}
//	cout << f[m] << endl;
//	return 0;
//}
//
//#include <iostream>
//#include <cstring>
//using namespace std;
//const int N = 5010, M = 2e6 + 10;
//int n, m;
//int x[N], w[N];
//int f[5*M], pos;
//int main()
//{
//	cin >> m >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		// 单价  限制 x  
//		int a, b; cin >> a >> b;
//		// 按照⼆进制拆分
//		int t = 1;
//		while (b >= t)
//		{
//			pos++;
//			w[pos] = t * a;
//			b -= t;
//			t *= 2;
//		}
//		if (b) // 处理剩余
//		{
//			pos++;
//			w[pos] = b * a;
//		}
//	}
//	memset(f, 0x3f, sizeof f);
//	f[0] = 0;
//	for (int i = 1; i <= pos; i++)
//	{
//		for (int j = 0; j <= m; j++)
//		{
//			f[j] = min(f[j], f[max(0, j - 1)] + w[i]);
//		}
//	}
//	cout << f[m] << endl;
//	return 0;
//}
//#include <iostream>
//#include <cstring>
//using namespace std;
//
//const int N = 5010, M = 2e6 + 10;
//int n, m;
//int x[N * 15], w[N * 15]; // 扩大数组以容纳二进制拆分后的物品
//int pos;
//int f[5 * M];
//
//int main() {
//    cin >> m >> n;
//    for (int i = 1; i <= n; i++) {
//        int a, b;
//        cin >> a >> b;
//        int t = 1;
//        while (b >= t) {
//            x[pos] = t;   // 记录数量
//            w[pos] = t * a; // 记录总价值
//            pos++;
//            b -= t;
//            t *= 2;
//        }
//        if (b > 0) {
//            x[pos] = b;
//            w[pos] = b * a;
//            pos++;
//        }
//    }
//
//    memset(f, 0x3f, sizeof(f));
//    f[0] = 0;
//
//    for (int i = 0; i < pos; i++) {
//        int t = x[i];
//        int cost = w[i];
//        for (int j = 5 * M - 1; j >= t; j--) { // 逆序更新，确保01背包
//            f[j] = min(f[j], f[j - t] + cost);
//        }
//    }

//    // 寻找至少m个的最小费用
//    int ans = 0x3f3f3f3f;
//    for (int j = m; j < 5 * M; j++) {
//        ans = min(ans, f[j]);
//    }
//
//    cout << ans << endl;
//    return 0;
//}
